package com.aaa.ssm.service.impl;

import com.aaa.ssm.dao.MenuDao;
import com.aaa.ssm.entity.Menu;
import com.aaa.ssm.service.MenuService;
import com.aaa.ssm.util.Page;
import com.aaa.ssm.vo.TreeNode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @ fileName:MenuServiceImpl
 * @ description:
 * @ author:张圣福
 * @ createTime:2023/10/5 21:10
 * @ version:1.0.0
 */
@Service
public class MenuServiceImpl implements MenuService {

    //注解依赖注入
   /* @Autowired
    @Qualifier*/
    @Resource
    private MenuDao menuDao;
    @Override
    public List<TreeNode> queryTreeData() {
        List<TreeNode> treeNodeList = menuDao.queryAllMenu();
        //定义返回集合（树形数据）
        List<TreeNode> treeNodeListResult = new ArrayList<>();
        //判断获取菜单是否为null
        //if(treeNodeList!=null&&treeNodeList.size()>0){
        if(!CollectionUtils.isEmpty(treeNodeList)){ //使用spring给我们提供的判断集合是否为null
            //循环
            for (TreeNode treeNode : treeNodeList) {
                //查找一级菜单（parentId=0）
                if(treeNode.getParentId()==0){
                    treeNodeListResult.add(treeNode);
                    //调用查找并绑定孩子方法
                    bindChildren(treeNode,treeNodeList);
                }
            }
        }
        return treeNodeListResult;
    }
    @Override
    public List<TreeNode> queryTreeDataByUserId(Integer userId) {
        //根据用户编号查询该用户对应的所有菜单
        List<TreeNode> treeNodeList = menuDao.queryMenuByUserId(userId);
        //定义返回集合（树形数据）
        List<TreeNode> treeNodeListResult = new ArrayList<>();
        //判断获取菜单是否为null
        //if(treeNodeList!=null&&treeNodeList.size()>0){
        if(!CollectionUtils.isEmpty(treeNodeList)){ //使用spring给我们提供的判断集合是否为null
            //循环
            for (TreeNode treeNode : treeNodeList) {
                //查找一级菜单（parentId=0）
                if(treeNode.getParentId()==0){
                    treeNodeListResult.add(treeNode);
                    //调用查找并绑定孩子方法
                    bindChildren(treeNode,treeNodeList);
                }
            }
        }
        return treeNodeListResult;
    }
    /**
     * -- 查找一级菜单（parentId=0）
     * select * from sys_menu where parent_id=0;
     * -- 查找一级菜单的孩子 = 二级菜单
     * select * from sys_menu where parent_id=1;
     * -- 查找二级菜单的孩子 = 三级菜单
     * select * from sys_menu where parent_id=100;
     * ....
     * ....
     * --   可以无限级别
     */
    /**
     * 为当前节点查询孩子并绑定
     * @param currentTreeNode  当前节点
     * @param treeNodeList   所有数据
     */
    private  void bindChildren(TreeNode currentTreeNode, List<TreeNode> treeNodeList){
        //循环所有数据
        for (TreeNode treeNode : treeNodeList) {
            //判断循环节的父节点id是否和当前节点的id相等
            if(currentTreeNode.getId()==treeNode.getParentId()){
                //获取当前节点孩子集合
                List<TreeNode> children = currentTreeNode.getChildren();
                //判断孩子是否为null
                if(children==null){ //如果当前是找到的第一个孩子，肯定是null
                    //为 null实例化对象
                    children = new ArrayList<>();
                }
                //添加当前循环节点
                children.add(treeNode);
                //给当前节点设置孩子集合
                currentTreeNode.setChildren(children);
                //自己调用自己为当前循环节点再找孩子   递归
                bindChildren(treeNode,treeNodeList);
            }
        }
    }



    /**
     * 查询所有
     * @param menu
     * @return
     */
    @Override
    public List<Menu> queryByParam(Menu menu) {
        return menuDao.queryByParam(menu);
    }

    /**
     * 通过Id查询
     * @param menuId
     * @return
     */

    @Override
    public Menu queryById(Integer menuId) {
        return menuDao.queryById(menuId);
    }

    /**
     * 添加
     * @param menu
     * @return
     */
    @Override
    public int add(Menu menu) {
        return menuDao.add(menu);
    }

    /**
     * 更新
     * @param menu
     * @return
     */
    @Override
    public int update(Menu menu) {
        return menuDao.update(menu);
    }

    /**
     * 删除
     * @param menuId
     * @return
     */
    @Override
    public int delete(Integer menuId) {
        return menuDao.delete(menuId);
    }

    /**
     * 分页查询
     * @param page
     * @return
     */
    @Override
    public PageInfo queryByPage(Page<Menu> page) {
        //设值分页参数   startPage(int pageNum, int pageSize)  pageNum 第几页  pageSize 页面
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        return new PageInfo(menuDao.queryByParam(page.getData()));
    }
}
